#ifndef __USB_H
#define __USB_H

#ifdef __cplusplus
extern "C"{
#endif

#include "rtthread.h"
#include "rttypes.h"
#include <stdbool.h>


#pragma pack(1)
struct Vision_Send_s
{
  uint8_t header ;
  uint8_t detect_color : 1;  // 0-red 1-blue
  uint8_t task_mode : 2;     // 0-auto 1-aim 2-buff
  bool reset_tracker : 1;
  uint8_t is_play : 1;
  bool change_target : 1;
  uint8_t reserved : 2;
  float roll;
  float pitch;
  float yaw;
  float aim_x;
  float aim_y;
  float aim_z;
  uint16_t game_time;  // (s) game time [0, 450]
  uint32_t timestamp;  // (ms) board time
  uint16_t checksum ;
};
#pragma pack() // 开启字节对齐,结束前面的#pragma pack(1)
extern struct Vision_Send_s Vision_Send;

#pragma pack(1)
struct Vision_Recv_s
{
  uint8_t header ;
  bool tracking :1; // 代表当前是否锁定目标
  uint8_t id : 3;          // 0-outpost 6-guard 7-base
  uint8_t armors_num : 3;  // 2-balance 3-outpost 4-normal
  uint8_t reserved : 1;
  float x; // 目标在世界坐标系下的 x 坐标
  float y; // 目标在世界坐标系下的 Y 坐标
  float z; //目标在世界坐标系下的 Z 坐标
  float yaw; // 目标在世界坐标系下的倾斜角度
  float vx; // 目标在世界坐标系下 x 方向的速度
  float vy; // 目标在世界坐标系下 y 方向的速度
  float vz; // 目标在世界坐标系下 z 方向的速度
  float v_yaw; // 目标旋转的角速度
  float r1; // 目标其中一组装甲板相对中心的半径
  float r2; // 目标另一组装甲板相对中心的半径
  float dz; // tracking 中的装甲板的上一块装甲板的 z 轴位置
  uint16_t checksum;
};
#pragma pack() // 开启字节对齐,结束前面的#pragma pack(1)
extern struct Vision_Recv_s Vision_Recv;





extern void ros_write(const rt_uint8_t *data, rt_uint8_t size);
extern void ros_read(rt_uint8_t *data, rt_uint8_t size);

#ifdef __cplusplus
}
#endif

#endif // USB_H